const rs = require("randomstring");
const config = require("./../config");
const md5 = require("md5")
const convert = require("xml-js")

module.exports = {
    // 生成随机字符
    randomString:()=>{
        return rs.generate(32);
    },
    // 生成签名
    getSign:(M)=>{
        // 1. 设所有发送或者接收到的数据为集合M

        // console.log(M)
        
        // 2. 将集合M内非空参数值的参数按照参数名ASCII码从小到大排序（字典序），
        const arr = Object.keys(M).sort();
        // ["appid","body","mch_id","nonce_str","notify_url","out_trade_no","total_fee","trade_type"]
        // appid=wx100749d4612ea385&body=华为P80手机&mch_id=1448624302&nonce_str=j6aIJDR2zzZzS6TAwkfDSlpiB1kXF7gY&notify_url=https://walter666.cn/wxpay/notify&out_trade_no=lyaaaa_0001&total_fee=1&trade_type=NATIVE&
        // 3. 使用URL键值对的格式（即key1=value1&key2=value2…）拼接成字符串stringA。
        let stringA = "";
        arr.forEach(val=>{
            stringA += `${val}=${M[val]}&`
        })
        // 4. 在stringA最后拼接上key得到stringSignTemp字符串，
        let stringSignTemp = stringA + "key=" + config.key
        // 5. 并对stringSignTemp进行MD5运算，
        // 6. 再将得到的字符串所有字符转换为大写，得到sign值signValue。
        let signValue = md5(stringSignTemp).toUpperCase();

        // 得到签名信息
        return signValue;
    },
    // 将json转成xml格式的数据
    getXml(M, sign){
        // 合并处理数据
        const obj = {
          xml: {
            ...M,
            sign
          }
        }
        // 转成xml
        const xml = convert.js2xml(obj, {
          compact: true
        })
        // <xml>
        //     <appid>wx100749d4612ea385</appid>
        //     <mch_id>1448624302</mch_id>
        //     <nonce_str>hsD6Hd1EF2LpSb4ZYkdCvacezQo1UaQS</nonce_str>
        //     <notify_url>https://walter666.cn/wxpay/notify</notify_url>
        //     <trade_type>NATIVE</trade_type>
        //     <body>华为P80手机</body>
        //     <out_trade_no>lyaaaa_0001</out_trade_no>
        //     <total_fee>1</total_fee>
        //     <sign>53C9E592A8A33D171043A0914144EC63</sign>
        // </xml>
        return xml;
    },
    xml2js (xml) {
        // 将xml转回json
        const obj = convert.xml2js(xml, {
          compact: true,
          textKey: 'value',
          cdataKey: 'value'
        })
        return obj
    }
}
